package main

import (
	"fmt"
	"math"
	"sort"
)

//利用第1题，构造3个以上图形，至少圆形、三角形、矩形各有一个，对上题的图形按照面积降序排列

// 定义一个 Shape 接口
type Shape interface {
	Area() float64
}

// 圆形结构体
type Circle struct {
	Radius float64
}

// 长方形结构体
type Rectangle struct {
	Length, Width float64
}

// 三角形结构体
type Triangle struct {
	Base, Height float64
}

// 为 Circle 类型实现 Area 方法
func (c Circle) Area() float64 {
	return math.Pi * c.Radius * c.Radius
}

// 为 Rectangle 类型实现 Area 方法
func (r Rectangle) Area() float64 {
	return r.Length * r.Width
}

// 为 Triangle 类型实现 Area 方法
func (t Triangle) Area() float64 {
	return 0.5 * t.Base * t.Height
}

// 按照面积降序排列的结构体
type ShapeWithArea struct {
	Shape
	Area float64
}

func main() {
	// 创建不同形状的实例
	circle := Circle{Radius: 5}
	rectangle := Rectangle{Length: 4, Width: 6}
	triangle := Triangle{Base: 3, Height: 4}
	square := Rectangle{Length: 3, Width: 3} // 一个正方形示例
	circle2 := Circle{Radius: 7}             // 另一个圆形示例

	// 将所有形状放入一个切片中
	shapes := []Shape{circle, rectangle, triangle, square, circle2}

	// 将形状和面积组合成一个切片
	var shapeWithAreas []ShapeWithArea
	for _, shape := range shapes {
		shapeWithAreas = append(shapeWithAreas, ShapeWithArea{
			Shape: shape,
			Area:  shape.Area(),
		})
	}

	// 对切片进行排序，按照面积降序排列
	sort.Slice(shapeWithAreas, func(i, j int) bool {
		return shapeWithAreas[i].Area > shapeWithAreas[j].Area
	})

	// 输出排序后的图形及其面积
	fmt.Println("Shapes sorted by Area (Descending):")
	for _, shapeWithArea := range shapeWithAreas {
		fmt.Printf("%T: %.2f\n", shapeWithArea.Shape, shapeWithArea.Area)
	}
}
